#include "trap.h"
    .set noat                # 禁止使用$at寄存器
    .globl main
    .data
b1data:  .byte   0xFF        # 定义字节数据
b2data:  .byte   0x12        # 定义字节数据
h1data:  .half   0xFFEE      # 定义半字数据
h2data:  .half   0x1234      # 定义半字数据
w1data:  .word   0xFEFEFEFE  # 定义字数据

    .text
main:
    # 加载地址到$s寄存器
    la      $s0, b1data        # $s0指向b1data
    la      $s1, b2data        # $s1指向b2data
    la      $s2, h1data        # $s2指向h1data
    la      $s3, h2data        # $s3指向h2data
    la      $s4, w1data        # $s4指向w1data

    # 加载字节和半字
    lb      $t0, 0($s0)        # $t0 = 0xFFFFFFFF (符号扩展)
    lb      $t1, 0($s1)        # $t1 = 0x00000012
    lh      $t2, 0($s2)        # 加载有符号半字
    lh      $t3, 0($s3)        # 加载有符号半字
    lw      $t4, 0($s4)        # 加载字

    # 加载无符号字节和半字
    lbu     $t0, 0($s0)        # $t0 = 0x000000FF (无符号扩展)
    lbu     $t1, 0($s1)        # $t1 = 0x00000012
    lhu     $t2, 0($s2)        # 加载无符号半字
    lhu     $t3, 0($s3)        # 加载无符号半字

    # 测试偏移加载
    lb      $t0, 1($s4)        # 加载偏移字节
    lb      $t1, 2($s4)        # 加载偏移字节
    lb      $t2, 3($s4)        # 加载偏移字节
    lb      $t3, 0($s2)        # 加载偏移字节
    lb      $t4, 1($s3)        # 加载偏移字节
    lh      $t0, 0($s4)        # 加载偏移半字
    lb      $t1, 2($s4)        # 加载偏移字节

    # 测试无符号偏移加载
    lbu     $t0, 1($s4)        # 加载无符号偏移字节
    lbu     $t1, 2($s4)        # 加载无符号偏移字节
    lbu     $t2, 3($s4)        # 加载无符号偏移字节
    lbu     $t3, 0($s2)        # 加载无符号偏移字节
    lbu     $t4, 1($s3)        # 加载无符号偏移字节
    lhu     $t0, 0($s4)        # 加载无符号偏移半字
    lbu     $t1, 2($s4)        # 加载无符号偏移字节

    # 初始化寄存器
    ori     $v0, $zero, 0x0034 # $v0 = 0x0034
    ori     $v1, $zero, 0xFEDC # $v1 = 0xFEDC
    lui     $a0, 0x1234        # $a0 = 0x12340000
    nop
    nop
    nop
    ori     $a0, $a0, 0x5678   # $a0 = 0x12345678
    lui     $a1, 0xFFEE        # $a1 = 0xFFEE0000
    nop
    nop
    nop
    ori     $a1, $a1, 0xDDCC   # $a1 = 0xFFEEDDCC

    # 测试存储与加载操作
    sb      $v0, 0($s0)        # 存储字节$v0到b1data
    sb      $v1, 1($s1)        # 存储字节$v1到b2data + 1偏移
    lbu     $t0, 0($s0)        # 加载无符号字节
    lbu     $t1, 0($s1)        # 加载无符号字节
    sh      $a0, 2($s2)        # 存储半字$a0到h1data + 2偏移
    sh      $v1, 0($s3)        # 存储半字$v1到h2data
    lhu     $t2, 0($s2)        # 加载无符号半字
    lhu     $t3, 0($s3)        # 加载无符号半字
    sw      $a0, 0($s4)        # 存储字$a0到w1data
    lw      $t4, 0($s4)        # 加载字

    # 程序结束
    HIT_GOOD_TRAP              # 停止模拟器